/*
 * Controller:
 *   da un lato fornire un servizio di "container" per IoC - DI
 *   verso le Action e relative estensioni.  In particolare lo scopo
 *   e' fornire una forma di servicelocator ... che comprende anche
 *   in un certo senso il businessDelegate. Nel senso che la action
 *   alla fine vede e usa solo una interfaccia... in teoria senza sapere e
 *   preoccuparsi di lavorare con un business layer ejb3.
 *
 *   Dall'altra vogliamo anche usare altri controller:
 *      * TilesRequestProcessor per gestire i layout delle pagine.
 *      Orbene, per nostra fortuna, StrutsLayout prevede gia' un controllore che
 *      estende TilesRequestProcessor
 *
 *   Conclusione: estendiamo il controllore StrutsLayout che estende quello di
 *                Tiles. con questo nostro nuovo controllore gestiamo il container
 *                per IoC-DI
 *
 *
 */

package magazzino.web;

import fr.improve.struts.taglib.layout.workflow.LayoutRequestProcessor;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionMapping;

import com.muchsoft.struts.annotations.InjectionHelper;
import java.util.logging.Logger;

public class MyControllerProcessor extends LayoutRequestProcessor {

    Logger myLog = Logger.getAnonymousLogger();

    {
        myLog.info("MyControllerProcessor ON");
    }

    @Override
    protected Action processActionCreate(HttpServletRequest request,
			HttpServletResponse response, ActionMapping mapping)
			throws IOException {

		String className = mapping.getType();

		Action instance;

		synchronized (actions) {

			boolean isNewInstance = (actions.get(className) == null);

			instance = super.processActionCreate(request, response, mapping);

			if (isNewInstance) {
				InjectionHelper.injectEJB(instance, instance
						.getClass());
			}
		}

		return instance;
	}

}
